package com.ly.robustvideomatting.model;

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;

public class MaskedImage {

//    static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }

    public static void applyMask(String imagePath, String maskPath, String outputPath) {
        // 读取图像和蒙版
        Mat image = Imgcodecs.imread(imagePath, Imgcodecs.IMREAD_COLOR);
        Mat mask = Imgcodecs.imread(maskPath, Imgcodecs.IMREAD_GRAYSCALE);

        // 检查图像是否已成功加载
        if (image.empty() || mask.empty()) {
            System.out.println("Error reading images!");
            return;
        }

        // 将原图转换为RGBA，以便添加alpha通道
        Mat imageRGBA = new Mat();
        Imgproc.cvtColor(image, imageRGBA, Imgproc.COLOR_BGR2BGRA);
        System.out.println("Channels: " + imageRGBA.channels());

        // 创建一个与原图相同大小的alpha通道
        Mat alphaChannel = new Mat();
        mask.convertTo(alphaChannel, CvType.CV_8UC1);  // 确保蒙版是单通道

        // 黑色不透明，白色完全透明，灰色半透明
        // OpenCV中，黑色是0，白色是255，因此我们需要反转
        Core.subtract(Mat.ones(mask.size(), CvType.CV_8UC1).setTo(new Scalar(255)), alphaChannel, alphaChannel);

        // 将alpha通道合并到RGBA图像中
        ArrayList<Mat> rgbaChannels = new ArrayList<>();
        Core.split(imageRGBA, rgbaChannels);  // 分割通道
        rgbaChannels.add(alphaChannel);  // 添加alpha通道
        Core.merge(rgbaChannels, imageRGBA);  // 合并通道

        // 保存结果图像
        Imgcodecs.imwrite(outputPath, imageRGBA);
    }

    public static void main(String[] args) {
//        nu.pattern.OpenCV.loadLocally();
        String imagePath = "output.png";  // 原始图像路径
        String maskPath = "output1.png";    // 蒙版图像路径
        String outputPath = "path_to_output.png"; // 输出图像路径

        applyMask(imagePath, maskPath, outputPath);
        System.out.println("Mask applied and image saved!");
    }
}
